﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Clases;
using Sistema_Totem.Clases.Fabricas;
using Sistema_Totem.Acceso_a_Datos.FabricaDAOS;
using System.Xml;
using System.IO;
using System.Data;
using System.Configuration;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Serialization;
using Sistema_Totem.Logica.Exepciones_Logica;

namespace Sistema_Totem.Logica.Comandos.ComandoRequerimiento
{
    public class ComandoModificarRequerimiento: Comando<bool>
    {

        #region Atributos

        private XmlDocument xmlReq = new XmlDocument();
        
        #endregion Atributos

        #region Constructor

        public ComandoModificarRequerimiento(Entidad requerimiento)
        {
            this.Entidad = requerimiento;
        }

        #endregion Constructor

        #region Metodos

        /// <summary>
        /// Implementacion del metodo Ejecutar del comando concreto
        /// </summary>
        /// <returns></returns>
        public override bool Ejecutar()
        {
            try
            {
                (this.Entidad as Requerimiento).Contenido =
                    ConstruirXmlRequerimiento(this.Entidad as Requerimiento);
                return FabricaDAO.CrearFabricaDeDAO(1).
                    CrearDAODocumentoRequerimiento().
                    ModificarRequerimiento(this.Entidad as Requerimiento);
            }
            catch (NullReferenceException exceptionXML)
            {
                throw (new RequerimientoExcepcion("Error, la devolucion del objeto es null", exceptionXML));
            }
        }

        /// <summary>
        /// Metodo que devuelve el XmlRequerimiento.
        /// </summary>
        /// <param name="_requerimiento"></param>
        /// <returns></returns>
        public XmlDocument ConstruirXmlRequerimiento(Requerimiento requerimiento) 
        {
            try
            {
                Requerimiento _requerimiento = requerimiento;
                XmlTextWriter _escritor = new XmlTextWriter("req.xml", System.Text.Encoding.UTF8);
                _escritor.Formatting = Formatting.Indented;
                _escritor.WriteStartDocument();
                _escritor.WriteStartElement("DOCUMENTO");
                _escritor.WriteStartElement("REFERENCIAS");
                _escritor.WriteEndElement();//fin de referencias
                foreach (Seccion _seccion in _requerimiento.ListaSeccion)
                {
                    _escritor.WriteStartElement("SECCION");
                    _escritor.WriteElementString("TITULO",
                        _requerimiento.ListaSeccion[0].Nombre);
                    foreach (ElementoControl _control in _seccion.ListaControl)
                    {
                        _escritor.WriteStartElement("ELEMENTO");
                        _escritor.WriteElementString("NOMBRE", _control.Nombre);
                        _escritor.WriteElementString("TIPO", _control.Tipo);
                        _escritor.WriteElementString("ESTADO", _control.Estado);
                        _escritor.WriteElementString("CONTENIDO", _control.Contenido);
                        _escritor.WriteEndElement();//fin de elemento
                    }
                    _escritor.WriteEndElement();//fin de titulo
                }
                _escritor.WriteEndElement();//fin de seccion y plantilla.
                _escritor.Flush();
                _escritor.Close();
                xmlReq.PreserveWhitespace = true;
                xmlReq.Load("req.xml");
                System.Diagnostics.Debug.Write(xmlReq.InnerXml);
            }
            catch (XmlException exceptionXML)
            {
                throw (new RequerimientoExcepcion("Error al crear el XML de Requerimiento", exceptionXML));
            }
                return xmlReq;          
        }

        #endregion Metodos
    }   
}